package br.usjt.component.login.assembler;

import static br.com.usjt.component.commons.login.util.ValidationUtil.isNull;
import static br.com.usjt.component.commons.login.util.ValidationUtil.not;
import static br.usjt.component.login.assembler.PerfilAssembler.associarPerfilDTOParaLoginDTO;
import static br.usjt.component.login.assembler.PerfilAssembler.associarPerfilParaLogin;
import static br.usjt.component.login.assembler.UsuarioAssembler.associarUsuarioDTOParaLoginDTO;
import static br.usjt.component.login.assembler.UsuarioAssembler.associarUsuarioParaLogin;

import java.util.ArrayList;
import java.util.List;

import br.usjt.component.login.dto.LoginDTO;
import br.usjt.component.login.model.Login;
import br.usjt.component.login.model.Usuario;

public class LoginAssembler {

    private Login entidade;
    private LoginDTO dto;

    public LoginAssembler(Login entidade) {
        this.entidade = entidade;
        toDTO(entidade);
    }

    public LoginAssembler(LoginDTO dto) {
        this.dto = dto;
        toEntity(dto);

    }

    public Login getEntity() {
        return entidade;
    }

    public LoginDTO getDto() {
        return dto;
    }

    private void toEntity(LoginDTO dto) {
        this.entidade = new Login();

        this.entidade.setId(dto.getId());
        this.entidade.setLogin(dto.getLogin());
        this.entidade.setSenha(dto.getSenha());
        this.entidade.setStatus(dto.isStatus());

    }

    private void toDTO(Login entidade) {
        this.dto = new LoginDTO();

        this.dto.setId(entidade.getId());
        this.dto.setLogin(entidade.getLogin());
        this.dto.setSenha(entidade.getSenha());
        this.dto.setStatus(entidade.isStatus());

    }

    public static LoginDTO converterParaLoginDTOUsando(Login login) {

        LoginDTO t = new LoginAssembler(login).getDto();
        associarUsuarioDTOParaLoginDTO(login.getUsuario(), t);
        associarPerfilDTOParaLoginDTO(login.getPerfil(), t);
        return t;
    }

    public static Login converterParaLoginUsando(LoginDTO dto) {
        Login login = new LoginAssembler(dto).getEntity();
        associarUsuarioParaLogin(dto.getUsuarioDTO(), login);
        associarPerfilParaLogin(dto.getPerfilDTO(), login);
        return login;
    }

    public static List<LoginDTO> converterParaListaLoginDTOUsando(List<Login> listaLogins) {
        List<LoginDTO> listaDtosLogins = new ArrayList<LoginDTO>();

        for (Login login : listaLogins) {
            if (not(isNull(login))) {
                LoginDTO dto = converterParaLoginDTOUsando(login);
                listaDtosLogins.add(dto);
            }
        }
        return listaDtosLogins;
    }

    static Usuario associarLoginParaUsuario(LoginDTO loginDto, Usuario user) {

        if (not(isNull(loginDto))) {
            Login login = new LoginAssembler(loginDto).getEntity();
            user.setLogin(login);
            login.setUsuario(user);

            associarPerfilParaLogin(loginDto.getPerfilDTO(), login);
        }
        return user;
    }

    public static void toEntityAttached(Login undetached, Login attached) {
        attached.setLogin(undetached.getLogin());
        attached.setSenha(undetached.getSenha());
        attached.setStatus(undetached.isStatus());

    }

}
